JavaWeb之过滤器Filter(登录校验)

编程入门 行业动态 更新时间:2024-10-26 21:31:35

JavaWeb之过<a href=https://www.elefans.com/category/jswz/34/1769218.html style=滤器Filter(登录校验)"/>

JavaWeb之过滤器Filter(登录校验)

1、过滤器Filter的定义

Filter是JavaWeb的三大组件之一(Servlet、Filter、Listener)。Filter是JavaEE的规范,也就是接口。在开发web应用时,如果编写的java类实现了这个接口,则把这个java类称为过滤器。

常见场景:字符编码设置、过滤操作、登录校验。
下面详细介绍一下用过滤器在Spring-boot框架中进行登录校验。

  1. 首先定义一个LoginCheckFilter类实现Filter接口,代码如下
package yuyanan.filter;import javax.servlet.*;
import java.io.IOException;@WebFilter(urlPatterns = "/*")
public class LoginCheckFilterimplements Filter {@Override   //初始化方法 只调用一次public void init(FilterConfig filterConfig) throws ServletException {System.out.println("init 初始化方法执行了");}@Override   //拦截到请求后调用,调用多次public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("拦截了请求");//放行chain.doFilter(request, response);}@Override  //销毁方法,只调用一次public void destroy() {System.out.println("destroy 销毁方法执行了");}
}

值得注意的是,这里需要给个WebFilter注解指出需要过滤的controller路径。这里使用的”/*“是全路径,即只要是浏览器向服务器发送请求,则就会执行该过滤器中的doFilter方法。
由于Filter并不是Spring boot里面的API,因此需要在MyspringCase1Application这个类里面添加注解@ServletComponentScan,让每次在执行spring boot项目时去执行过滤器。代码如下:

package yuyanan;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@ServletComponentScan    //开启了对servlet组件的支持
@SpringBootApplication
public class MyspringCase1Application {public static void main(String[] args) {SpringApplication.run(MyspringCase1Application.class, args);}}

接下来是在过滤器中实现登录校验,该代码中使用的是JWT校验,就是当用户登录上后,服务器会给其生成一个令牌,然后将令牌返回,等下次用户访问时会先去过滤器中检查令牌是否合法。

下面是下发令牌代码:

package yuyanan.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import yuyanan.pojo.Emp;
import yuyanan.pojo.Result;
import yuyanan.service.EmpService;
import yuyanan.utils.JwtUtils;import java.util.HashMap;
import java.util.Map;@Slf4j
@RestController
public class LoginController {@Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody Emp emp){log.info("员工登录:{}", emp);Emp e = empService.login(emp);//登录成功,生成令牌,下发令牌if (e != null){Map<String, Object> claims = new HashMap<>();claims.put("id", e.getId());claims.put("name", e.getName());claims.put("username", e.getUsername());String jwt = JwtUtils.generateJwt(claims);    //jwt包含了当前登录的员工信息return Result.success(jwt);}//登录失败,返回错误信息return Result.error("用户名或者密码错误");}
}

过滤器在实现验证登录时,判断流程如下:

  1. 获取请求url;
  2. 判断请求url中是否包含login,如果包含,说明是登录操作,放行;否则执行3;
  3. 获取请求头中的令牌(token);
  4. 判断令牌是否存在,如果不存在,返回错误结果(未登录);
  5. 解析token,如果解析失败,返回错误结果(未登录);
  6. 如果上述条件都满足,则直接放行即可。
    代码如下:
package yuyanan.filter;import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import yuyanan.pojo.Result;
import yuyanan.utils.JwtUtils;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@Slf4j
//@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;//1、获取请求urlString url = req.getRequestURL().toString();log.info("请求的url:{}", url);//2、判断请求url中是否包含login,如果包含,说明是登录操作,放行if (url.contains("login")){log.info("登录操作,放行...");chain.doFilter(request, response);return;}//3、获取请求头中的令牌(token)String jwt = req.getHeader("token");//4、判断令牌是否存在,如果不存在,返回错误结果(未登录)if(!StringUtils.hasLength(jwt)){log.info("请求头token为空,返回未登录的信息");Result error = Result.error("NOT_LOGIN");//手动转换  对象--json ---------》阿里巴巴的fastJsonString jsonString = JSONObject.toJSONString(error);resp.getWriter().write(jsonString);return;}//5、解析token,如果解析失败,返回错误结果(未登录)try {JwtUtils.parseJWT(jwt);}catch (Exception e){    //jwt令牌解析失败e.printStackTrace();log.info("请求头token为空,返回未登录的信息");Result error = Result.error("NOT_LOGIN");//手动转换  对象--json ---------》阿里巴巴的fastJsonString jsonString = JSONObject.toJSONString(error);resp.getWriter().write(jsonString);return;}//6、放行log.info("令牌合法,放行!");chain.doFilter(request, response);}
}

更多推荐

JavaWeb之过滤器Filter(登录校验)

本文发布于:2023-12-03 08:47:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1653388.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:滤器   之过   JavaWeb   Filter

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!