题目要求:
login.jsp(用户名、密码)点登录–>UserController—>login(只允许用户名和密码均为XXXXXX的用户登录)登录失败跳回login.jsp(讲用户所填数据回填,并提示“用户名或密码错误”)
登录成功,把用户名放到session中,重定向到main方法中,在此方法中跳转到main.jsp页面。并且利用自定义拦截器,拦截直接访问mian方法且未登录的请求。
编译环境idea
建好如下目录结构
所需jar包
源码部分
JSP
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form:form modelAttribute="user" method="post" action="${pageContext.request.contextPath}/login">
用户名:<form:input path="username"/><br/>
密码:<form:password path="password"/><br/>
<input type="submit" value="登录" />
<h3 style="color: darkred">${msg}</h3>
</form:form>
</body>
</html>
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
欢迎登录
</body>
</html>
User.java
package com.bean;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
UserController
package com.controller;
import com.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
public class UserController {
@RequestMapping("/toLogin")
public String toLogin(@ModelAttribute("user") User user){
return "login";
}
@RequestMapping("/login")
public String login(@ModelAttribute User user, HttpSession session,Model model ){
if("896469808".equals(user.getUsername())&&"123456".equals(user.getPassword())){
session.setAttribute("username",user.getUsername());
return "redirect:/index";
}else{
//
session.removeAttribute("username");
model.addAttribute("msg","用户名或密码错误");
return "login";
}
}
@RequestMapping("/index")
public String index(){
return "main";
}
@RequestMapping("/test")
public String test(){
return "test";
}
}
MyFilter.java
package com.filter;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class MyFilter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//判断session中有无username ,若有正常的请求,return true
// 若没有跳转到login.jsp
//只有controller层的RequestMapping含有的路径才会起作用
String[] check = {"index", "hello", "test"};
HttpSession session = request.getSession();//获取
// 前者 request.getRequestURI() 返回除去host(域名或者ip)部分的路径,取在浏览器键入的路径和controller层的RequestMapping含有的路径进行对比,一样才会继续执行
// String.contains("index")是对该路径进行解析是否含有index,只有登录成功后,username才会有值
if (session.getAttribute("username") == null) {
//非法请求
for (int i = 0; i < check.length; i++) {
if (request.getRequestURI().contains(check[i]) == true) {
response.sendRedirect("/spring_login/toLogin");
return false;
}
}
}
return true;
}
}
SpringMVCConfig.java
package com;
import com.filter.MyFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan("com")
public class SpringMVCConfig implements WebMvcConfigurer {
/**
* 配置视图解析器
*/
@Bean
public InternalResourceViewResolver getViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
/**
* 配置静态资源
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/html/**").addResourceLocations("/html/");
//addResourceHandler指的是对外暴露的访问路径
//addResourceLocations指的是静态资源存放的位置
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyFilter());
}
}
WebConfig.java
package com;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
public class WebConfig implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext arg0) throws ServletException {
AnnotationConfigWebApplicationContext ctx
= new AnnotationConfigWebApplicationContext();
ctx.register(SpringMVCConfig.class);//注册Spring MVC的Java配置类SpringMVCConfig
ctx.setServletContext(arg0);//和当前ServletContext关联
/**
* 注册Spring MVC的DispatcherServlet
*/
javax.servlet.ServletRegistration.Dynamic servlet =
arg0.addServlet("dispatcher", new DispatcherServlet(ctx));
servlet.addMapping("/");
//当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
servlet.setLoadOnStartup(1);
/**
* 注册字符编码过滤器
*/
javax.servlet.FilterRegistration.Dynamic filter =
arg0.addFilter("characterEncodingFilter", CharacterEncodingFilter.class);
filter.setInitParameter("encoding", "UTF-8");
filter.addMappingForUrlPatterns(null, false, "/*");
}
}
运行效果如下
如下是拦截成功后重定向到login