使用SpringMVC拦截器实现简单的登陆验证功能(面向小白)

版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/MaNongXf/article/details/83509837

接着上一篇文章《使用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 重写它的方法

扫描二维码关注公众号,回复: 4067222 查看本文章
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!!!

猜你喜欢

转载自blog.csdn.net/MaNongXf/article/details/83509837