以下是实现未登录不能进入页面的实现

使用了thyemeleaf+SpringBoot+过滤器实现的,过滤器的核心代码如下:

@Component

@WebFilter(filterName= "TestFilter",urlPatterns = "/*")

@Order(1) //Order(1)在定义多个Filter时,用于决定执行顺序的,数字越小,越先执行。

public class TestFilter implementsFilter {private static final Set ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>(

Arrays.asList("/index", "/login")));

@Overridepublic void init(FilterConfig filterConfig) throwsServletException {

}

@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throwsIOException, ServletException {// //这样在每个Servlet执行的时候都会先进行这个

HttpServletRequest request=(HttpServletRequest) servletRequest;

HttpServletResponse response=(HttpServletResponse) servletResponse;

System.out.println("过滤器实现");if(needLogin(request)) {//需要登录则跳转到登录Controller

String userName = (String)((HttpServletRequest) request).getSession().getAttribute("userName");

System.out.println("userName="+userName);

System.out.println(Optional.ofNullable(userName).map(String::length).orElse(0));if(Optional.ofNullable(userName).map(String::length).orElse(0) <= 0){

response.sendRedirect("login");//response.sendRedirect(request.getContextPath()+"/login");

}

filterChain.doFilter(servletRequest, servletResponse);return;

}else{

}//因为有可能不止这一个过滤器,所以需要将所有的过滤器执行//注意 这一行代码一定要写到最后

filterChain.doFilter(servletRequest, servletResponse);

}

@Overridepublic voiddestroy() {

}private booleanneedLogin(HttpServletRequest request) {//进行是否需要登录的判断操作

String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", "");

System.out.println(path);boolean allowedPath =ALLOWED_PATHS.contains(path);

System.out.println(allowedPath);return !allowedPath;

}

}

View Code

代码链接:

链接:https://pan.baidu.com/s/1Kvh4JWCM3aIpiaqK67Rw3g 密码:pa57

过滤器虽然也能实现,但是用起来会有个问题,假如说是我请求http://localhost:8080/usercenter,时,我期望的过程是,在过滤器里发现未登录,直接就跳转进入login,但是,实际山遇到的情况是,会先进入我的usercenter方法,跑过这个方法之后再进过滤器,再走login,这就会出现情况,假如说是我的usercenter方法(由于未登录导致出现方法中出现null的情况)有问题,导致最后页面报500

,为了解决这个问题,采用了拦截器,正好就是自己想要的效果,未登录的时候不进入usercenter,直接进入login

一下是拦截器代码:

拦截器的:

@Configurationpublic class LoginInterceptor implementsHandlerInterceptor {

@Override//在执行目标方法之前执行

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException {

System.out.println("------:进来拦截器了!--1");//获取session

HttpSession session = request.getSession(true);//判断用户ID是否存在,不存在就跳转到登录界面

if(session.getAttribute("phoneNum") == null){

System.out.println("------:跳转到login页面!");

response.sendRedirect(request.getContextPath()+"/login");return false;

}else{

session.setAttribute("phoneNum", session.getAttribute("phoneNum"));return true;

}

}

@Override//执行目标方法之后执行

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throwsException {

System.out.println("------:进来拦截器了!--2");

}

@Override//在请求已经返回之后执行

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throwsException {

System.out.println("------:进来拦截器了!--3");

}

}

View Code

配置文件的:WebConfig.java的代码:

@Configuration

@EnableWebMvc

@ComponentScanpublic class WebConfig extends WebMvcConfigurerAdapter implementsApplicationContextAware {privateApplicationContext applicationContext;publicWebConfig(){super();

}

@Overridepublic voidaddResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");

registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/templates/");super.addResourceHandlers(registry);

}

@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throwsBeansException {this.applicationContext =applicationContext;

}

@Overridepublic voidaddInterceptors(InterceptorRegistry registry) {//拦截规则:除了login,其他都拦截判断

registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/index", "/login","register");super.addInterceptors(registry);

}

}

View Code

这样就能完美的解决过滤器时遇到的问题

结束

代码链接:链接:https://pan.baidu.com/s/1QusjeJ2EVo4K55xN_saooQ 密码:nh85

java 登录过滤_Java 过滤器实现(登录) + 拦截器(两种方法)相关推荐

  1. java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  2. (十六)ATP应用测试平台——java应用中的过滤器Filter、拦截器Interceptor、参数解析器Resolver、Aop切面,你会了吗?

    前言 过滤器Filter.拦截器Interceptor.参数解析器Resolver.Aop切面是我们应用开发中经常使用到的技术,到底该如何使用这些web附属功能, 本小节我们就分别介绍一下其各自的用法 ...

  3. java校验码的设计_Java动态验证码单线设计的两种方法

    1.java的动态验证码我这里将介绍两种方法: 一:根据java本身提供的一种验证码的写法,这种呢只限于大家了解就可以了,因为java自带的模式编写的在实际开发中是没有意义的,所以只供学习一下就可以了 ...

  4. java发送get请求_java发送http get请求的两种方法(总结)

    长话短说,废话不说 一.第一种方式,通过HttpClient方式,代码如下: public static String httpGet(String url, String charset) thro ...

  5. java构建json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  6. xp系统网页java不显示,xp系统打开jsp文件的两种方法

    使用xp系统的时候会碰到各种文件,比如png.log.exe等等,一位用户说遇到后缀名是jsp的文件,jsp文件是什么?有什么作用呢?jsp格式文件是一种动态网页技术标准,是用java script脚 ...

  7. java 微信请求_Java web微信请求拦截器(微信公众号开发)

    Java web微信请求拦截器(微信公众号开发),获取微信用户信息. package com.mvc.interceptor; import com.alibaba.fastjson.JSONObje ...

  8. java random构造方法_Java中的Random()函数及两种构造方法

    Java中存在着两种Random函数: java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是 ...

  9. java 当月最后一天_java中取得当月最后一天的四种方法

    java中取得当月最后一天的四种方法 第一种,使用Calendar的roll方法,在限制某个日期字段不改变的形式下,改变其他日期字段的值. 第二种,使用Calendar的getActualMaximu ...

最新文章

  1. 字节开启员工期权兑换,126美元每股;
  2. 2021-7-26 pytorch深度学习框架学习
  3. 每天只睡4小时!大佬们都这么拼吗?
  4. .net autofac Web Forms
  5. SQLServer 2012 报表服务部署配置(1)
  6. vscode插件列表及配置信息
  7. java camel dsl,Apache Camel与Spring DSL
  8. VMware虚拟机打开后不兼容
  9. 高效实用Kafka-Kafka消息处理(底层原理)
  10. 那些让程序员炸毛的奇葩需求,说起来满满的都是泪!
  11. 一文简说北斗定位系统的前世今生
  12. 1.微信小程序(colorUI)- 引入colorUI
  13. 信息系统与信息化、信息系统开发方法、常规信息系统集成技术
  14. ir2110驱动占空比不能太高
  15. innobackupex备份与恢复
  16. c语言factors函数的意思,factors是什么意思_factors的翻译_音标_读音_用法_例句_爱词霸在线词典...
  17. CLIP CLAP
  18. matlab图像的裁剪
  19. 机器学习之——什么是Onehot编码?
  20. PHP 获取本月与上个月的第一天和最后一天

热门文章

  1. Unity Ragdoll的坑
  2. MongoDB 固定集合(Capped Collections)
  3. 求助各位朋友 帮忙安装谷歌词霸
  4. 机器学习与人脸识别1:如何理解机器学习
  5. 查看linux系统信息的常用命令
  6. ANSYS Workbench仿真(一):Design modeler建模
  7. 矩形弹性固体的平面或者轴对称应变分析(python,有限元)
  8. windows脚本编程------WshNetwork对象
  9. 基于node.js网上蛋糕店系统的设计与实现(论文+项目源码)
  10. 第二篇web前端面试自我介绍(刚毕业的菜鸟)