使用SpringMVC拦截器实现简单的登陆验证功能(面向小白,史上最详细)
接着上一篇文章《使用Idea创建一个JavaWeb的SSM(maven)项目实现登陆功能》
在上一篇文章里已经实现了页面登陆的功能,但是不够完善,在没有拦截器的情况下我可以不登陆一样可以访问index.jsp页面
如图
在这种情况下项目是有风险的,别人可以在不登陆的情况下随意访问你的项目路径
这时候就可以使用拦截器来避免这种情况(这里只是最简单的实现,别的可以自己琢磨琢磨~)
在你的springMVC.xml配置文件种加上拦截器和过滤静态资源
<!--拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login/toLogin*" /><!--这是指明某些请求不需要经过拦截器-->
<mvc:exclude-mapping path="/login/login*" />
<bean class="com.sixmai.interceptor.LoginInterceptor"></bean><!--这里是你配置的拦截器的路径-->
</mvc:interceptor>
</mvc:interceptors>
<!-- 过滤静态资源 -->
<mvc:default-servlet-handler />
然后在你的原来登陆的controller里添加一段代码,登陆成功就把你的登陆名存进session 如图
(也许我们的方法不一样,但是原理都一样,我用的session你也可以用cookie或者是Redis)
package com.sixmai.controller;
import com.sixmai.domain.User;
import com.sixmai.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
import java.util.Map;
@Controller
@RequestMapping("login")
public class LoginController {
@Autowired
private LoginService loginService;
@RequestMapping("toLogin")
public String toLogin() {
return "login.jsp";
}
@RequestMapping("login")
public String login(User user, Model model, HttpSession session) {
String loginname = user.getLoginname();
String password = user.getPassword();
Map<String, Object> map = loginService.login(loginname, password);
if (map.get("status").equals("200")) {
//============================如果登陆成功就把用户名存进session====================
session.setAttribute("loginname",loginname);
//===============================================================================
return "system/index.jsp";
} else {
model.addAttribute("error", map.get("msg"));
return "login.jsp";
}
}
}
修改好了以后在项目种创建一个interceptor文件夹
接下来在interceptor文件夹种添加一个拦截器(LoginInterceptor)并且实现HandlerInterceptor 重写它的方法
package com.sixmai.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
//之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
HttpSession session = request.getSession();
String loginname = (String) session.getAttribute("loginname");//从session取出登陆名
if (loginname !=null&&!loginname.equals("")){//判断是否存进去了登陆名,没有存进去就是没登陆
return true;
}
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);//没登陆就给你跳转到登陆页面
return false;
}
@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 {
}
}
到这里基本就配置完成了
当我再次想通过访问/index/toIndex访问index.jsp页面的时候就给我自动跳转到了login.jsp页面
The end!!!