1.项目基本框架
1.总体项目结构
2.添加依赖
除了数据库相关以外,添加依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- spring boot tomcat jsp 支持开启 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.30</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.代码
1.页面
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
你已成功访问到主页面!
</body>
</html>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<style>
body {
background-image: url('/static/image/background.jpg');
background-repeat: no-repeat;
background-size: cover;
}
</style>
<body>
<form method="get" action="/user/login" >
用户名:<input type="text" name="userName"/><br/>
密码:<input type="text" name="password"/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
<style>中给登录界面添加了一个静态资源(背景图片),添加的是工程结构中resources.static.image目录下的图片。
为了使静态资源/static/路径引用方式生效,需要添加配置,工程中SessionConfiguration文件代码如下
package com.web;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SessionConfiguration implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
2.启动设置
在application.properties文件中配置
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
#启动路径及浏览器配置
spring.auto.openurl=true
spring.web.mainUrl=http://127.0.0.1:8080/user/main
spring.web.googleexcute=C:\\Users\\conan\\AppData\\Local\\Google\\Chrome\\Application\\Chrome.exe
启动路径及浏览器配置功能为,程序启动时,直接调用本地谷歌浏览器访问主页面,不需要手动在浏览器中输入访问路径,实现此功能的CommandRunner文件代码如下
package com.web.config;
import com.web.utils.LogManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class CommandRunner implements CommandLineRunner {
@Value("${spring.web.mainUrl}")
private String mainUrl;
@Value("${spring.web.googleexcute}")
private String googleExcutePath;
@Value("${spring.auto.openurl}")
private boolean isOpen;
@Override
public void run(String[] args)throws Exception{
if(isOpen){
String cmd = googleExcutePath + " "+ mainUrl;
Runtime runing = Runtime.getRuntime();
try {
runing.exec(cmd);
LogManager.info("启动浏览器打开项目成功");
}catch (Exception e){
e.printStackTrace();
LogManager.error(e.getMessage());
}
}
}
}
LogManager的功能为使用log4j进行日志输出,这部分的配置及使用不在此记录。
3.mybatis
使用mybatis进行数据库用户信息的读取
UserInfo
package com.web.model;
import lombok.Data;
@Data
public class UserInfo {
private String userName;
private String password;
}
OracleMapper
package com.web.mapper;
import com.web.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface OracleMapper {
List<UserInfo> getUserInfo();
}
OracleMapper.xml,要注意对应引用的package
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.web.mapper.OracleMapper" >
<select id="getUserInfo" resultType="com.web.model.UserInfo">
SELECT * FROM userinfo
</select>
</mapper>
mybatis-config.xml,mybatis配置文件,设置了log4j日志输出
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
</configuration>
application.properties中添加配置
mybatis.mapper-locations=classpath:mybatis/mapper/*Mapper.xml
mybatis.type-aliases-package=com.web
mybatis.config-location=classpath:mybatis/mybatis-config.xml
4.Controller
登录逻辑LoginController代码
package com.web.controller;
import com.web.mapper.OracleMapper;
import com.web.model.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Controller
@RequestMapping(value = "/user")
public class LoginController
{
@Autowired
public OracleMapper oracleMapper;
@RequestMapping(value = "/login")
public void login(UserInfo userInfo, HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println(request.getRequestURI());
//登录成功
boolean flag = true;
List<UserInfo> userInfos = new ArrayList<UserInfo>();
userInfos = oracleMapper.getUserInfo();
//查询账号是否存在
List<UserInfo> result = null;
result = userInfos.stream().filter((UserInfo ui) ->
(userInfo.getUserName().equals(ui.getUserName()) && userInfo.getPassword().equals(ui.getPassword())))
.collect(Collectors.toList());
if (result == null || result.size() == 0)
{
flag = false;
}
//登录成功
if(flag){
//将用户写入session
request.getSession().setAttribute("_session_user", userInfo);
}
response.sendRedirect("/user/main");
}
}
MainController
package com.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/user")
public class MainController {
@RequestMapping(value = "/login",method = RequestMethod.GET)
public String login(){
return "login";
}
@RequestMapping(value = "/main",method = RequestMethod.GET)
public String main(){
return "main";
}
}
以上,基本逻辑编写完成。
涉及到的访问url:
登录页面:http://127.0.0.1:8080/user/login
主页面:http://127.0.0.1:8080/user/main
启动程序,发现直接进入到了主页面
3.拦截器
SessionInterceptor
package com.web;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class SessionInterceptor implements HandlerInterceptor
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
System.out.println(request.getRequestURI());
//登录不做拦截
if(request.getRequestURI().equals("/user/login"))
{
return true;
}
//验证session是否存在
Object obj = request.getSession().getAttribute("_session_user");
if(obj == null)
{
response.sendRedirect("/user/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
在session不存在,即程序启动后未进行过账号登录的情况下,屏蔽除登录页面的其他页面,访问其他页面(主页面)时跳转到登录页面让用户先进行登录,SessionConfiguration中补充方法及导入
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/**");
}
重新启动程序,发现登录页面首先出现了,但图片未显示原因是拦截器将/static/这样的路径访问也同时拦截掉了,需要在拦截配置中排除静态资源,SessionConfiguration改写后完整代码如下
package com.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SessionConfiguration implements WebMvcConfigurer {
@Autowired
private SessionInterceptor sessionInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration addInterceptor = registry.addInterceptor(sessionInterceptor);
// 排除配置
addInterceptor.excludePathPatterns("/static/**");//排除静态资源
addInterceptor.addPathPatterns("/**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
启动后输入用户名密码,没有跳转到主页面,注意到此时的网址中显示出了用户名和密码,调试MainController以及LoginController中的代码发现,由于网址不符合跳转逻辑,导致没有进入登录判断逻辑修改login.jsp
<form method="post" action="/user/login">
get改为post后,网址中不再显示用户名及密码,判断登录后跳转到主页面。
项目总体代码可从https://github.com/lss0219/Movie下载