您的位置:首页 > 编程语言 > Java开发

SpringMVC-利用filter实现安全登录

2017-12-14 09:18 519 查看
安全登录,不同与普通登录。

安全登录是什么呢?就是只要用户名和密码不正确,除了登陆页面,其他页面你进不去,这就是安全登录。

刚开始,用springmvc自带的拦截器试了一下,效果出来了,但是发现了个问题,就是只能拦截到处理器的请求,其他请求不能拦截,比如我在地址栏里输入一个地址,依然可以跳转,这就很不好,为此,我选用了filter过滤器来进行过滤。

代码如下:

首先是过滤器的代码:

public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) servletrequest;
HttpServletResponse response=(HttpServletResponse) servletresponse;
String servletPath = request.getServletPath();
System.out.println("servletPath"+servletPath);
Object session = request.getSession().getAttribute("pro");
System.out.println("session="+session);
//只要用户回到登录页面,就把session销毁,这样就需要重新登录
if(servletPath.contains("/html/login.jsp") || servletPath.contains(" ")){
System.out.println("销毁session");
request.getSession().removeAttribute("pro");
}
//如果用户没有登录是不能直接进入其他页面的
if(session != null){

System.out.println("---------放行------------");
chain.doFilter(request, response);

return;
}
else{
System.out.println("===进入判断体===");
request.getRequestDispatcher("/html/login.jsp").forward(request, response);
}

}再来看web.xml的配置:
<!-- 注册自定义过滤器,实现安全登录 -->
<filter>
<filter-name>myfilter</filter-name>
<filter-class>com.aynu.interceptor.myfilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>*.jsp</url-pattern>

</filter-mapping>


当然,我们可以用init,将/html/login.jsp写进去,在filter获取到再利用,这样在后续维护中会很方便。

这个时候,图片呀什么的可能不能显示,那怎么办呢?

这样,先看在web.xml里的配置:

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/css</url-pattern>
<url-pattern>/js</url-pattern>
<url-pattern>/images</url-pattern>
<url-pattern>/jq</url-pattern>
<url-pattern>/jquery-3.2.1.js</url-pattern>
<url-pattern>/jquery-form.js</url-pattern>
</servlet-mapping>

载看spring-mvc.xml里配置:
<mvc:default-servlet-handler/>

这个时候,我们想要的功能基本已经实现,没有登录在地址栏无论输入哪个地址,是进不去的,但是问题来了,假如我们用户名密码不存在或者错误呢?依然可以进入,这时候,就需要在处理器中做这样的逻辑了:

//返回登录页面
@RequestMapping("/login.do")
public String login(){

return "/html/login.jsp";
}

//接收登录信息
@RequestMapping(value="/some.do",method=RequestMethod.POST)
@ResponseBody
public ModelAndView pro(Pro pro,RedirectAttributes re,HttpSession seesion,HttpServletRequest request){
boolean x=service.selectPro(pro);
ModelAndView mv = new ModelAndView();
seesion.setAttribute("pro", pro);
if(x == false){
request.getSession().removeAttribute("pro");
mv.setViewName("redirect:/pro/login.do");
return mv;
}
//mv.addObject("re", "xxx");
//re.addFlashAttribute("re", "用户名或密码错误");
mv.setViewName("redirect:/html/index.jsp");
System.out.println("=====");
return mv;
}

OK,效果达到,如果哪位大牛有更好的方法,请在下面留言。
希望我们共同学习和进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息