spring boot 里面用拦截器好像比用过滤器多一些. 在过滤器中, 并不能获取到action的相关信息, 会造成很多的麻烦和功能欠缺.

那, 这里就用过滤器做一个小栗子, 实际使用过程中, 不会这么做的.

用过滤器做一个不完善的登录权限判断.

一. 过滤器

package org.elvin.springboot.filter;

import org.thymeleaf.util.StringUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; public class LoginFilter implements Filter { private String passUrl; private String loginUrl; //region getter / setter
public String getPassUrl() {
return passUrl;
} public void setPassUrl(String passUrl) {
this.passUrl = passUrl;
} public String getLoginUrl() {
return loginUrl;
} public void setLoginUrl(String loginUrl) {
this.loginUrl = loginUrl;
}
//endregion @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void destroy() { } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response; if(isPassUrl(req)){
filterChain.doFilter(req, resp);
return;
} HttpSession session = req.getSession();
String token = (String)session.getAttribute("token");
if(StringUtils.isEmpty(token)){
resp.sendRedirect(req.getContextPath() + loginUrl);
return ;
} filterChain.doFilter(req, resp);
} /**
* 判断是否不需要权限
* @param req
* @return
*/
public boolean isPassUrl(HttpServletRequest req){
String requestURI = req.getRequestURI() + ";";
String contextPath = req.getContextPath();
if(!requestURI.startsWith(contextPath)){
return false;
}
requestURI = requestURI.substring(contextPath.length());
if(0 <= passUrl.indexOf(requestURI)){
return true;
}
return false;
}
}

在这里栗子里, 应该在过滤器里面加个文件请求过滤. 不过, 好像没有影响到结果, 所以, 懒得处理了, 后面拦截器的时候, 会再实现一遍这个功能.

二. 拦截器的java配置文件

package org.elvin.springboot.config;

import org.elvin.springboot.filter.LoginFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; @Configuration
public class LoginConfig { @Value("${passUrl}")
private String passUrl; @Value("${loginUrl}")
private String loginUrl; @Bean(name="loginFilter")
public Filter loginFilter(){
LoginFilter filter = new LoginFilter();
filter.setPassUrl(passUrl);
filter.setLoginUrl(loginUrl);
return filter;
} @Bean
public FilterRegistrationBean registrationBean(){
FilterRegistrationBean reg = new FilterRegistrationBean();
reg.setFilter(loginFilter());
reg.addUrlPatterns("/*");
reg.setName("loginFilter");
reg.setOrder(Integer.MAX_VALUE);
return reg;
} }

这里面没有写注释了, 看到方法名, 应该能看明白方法是干啥的.

三. yml配置文件

passUrl: /login/index;/login/checkOut;
loginUrl: /login/index

loginUrl 是登录页面地址, passUrl 是不需要登录的页面地址

到这里, 过滤器已经结束了. 接下来, 加入控制器和视图.

四. controller / view

package org.elvin.springboot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; @Controller
@RequestMapping("login")
public class LoginController { @Autowired
private HttpServletRequest request; @GetMapping("index")
public String index(){
HttpSession session = request.getSession();
session.setAttribute("token", "token"); return "login/index";
} @PostMapping("checkOut")
@ResponseBody
public String checkOut(){
HttpSession session = request.getSession();
session.setAttribute("token", null);
return "success";
}
}

html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>index</title>
<link rel="stylesheet" th:href="@{/bootstrap/css/bootstrap.css}" />
</head>
<body>
<div class="container">
<input type="button" th:value="登出" id="checkout"/>
</div> <script th:src="@{/js/jquery-1.11.3.js}"></script>
<script th:src="@{/bootstrap/js/bootstrap.js}" ></script>
<script th:inline="javascript">
$(function(){
$(".container").delegate("#checkout", "click", function(){
$.ajax({
url: [[@{/login/checkOut}]],
type:'post',
data:'',
success: function(res){
if(res == "success"){
alert("登出成功!");
}
}
});
});
});
</script>
</body>
</html>

结果展示还真不好弄, 得弄成 动态图片, 额, 个人比较懒, 就算了.

spring boot 与 filter的更多相关文章

  1. Spring Boot实践——Filter实现

    Filter介绍 Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截.但是它适合更粗粒度的拦截,在请求前后做一些编解码处理.日志记录等. 一个Filter包括:1).在 ...

  2. spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)

    一,为什么要使用filter来实现简繁体转换? 项目中有时会有同时支持简体和繁体两种字符集的要求, 或者搜索引擎有支持繁体输入字符的需求. 针对繁体字符的显示, 我们通常会在数据库和模板.文案配置中默 ...

  3. Spring Boot配置Filter

    此博客是学习Spring Boot过程中记录的,一来为了加深自己的理解,二来也希望这篇博客能帮到有需要的朋友.同时如果有错误,希望各位不吝指教 一.通过注入Bean的方式配置Filter: 注意:此方 ...

  4. Spring Boot 使用 Filter

    Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理. 1. 编写 ...

  5. Spring boot 注册Filter , Listener, Servlet

    1: ServletRegistrationBean   Servlet @Bean public ServletRegistrationBean myServlet(){ ServletRegist ...

  6. spring boot 捕获filter异常 统一返回处理结果

    如前面的文章所述,controller中抛出的异常我们使用ControllerAdvice来处理: @RestControllerAdvice @Slf4j public class GlobalEx ...

  7. Spring Boot的filter简单使用

    过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean     public FilterRegistrati ...

  8. Spring Boot 整合Filter

    两种方法 方法一: 正常创建好Filter类,配置完成 package clc.user.filter; import javax.servlet.Filter; import javax.servl ...

  9. Spring Boot 自定义Filter

    一.Filter功能 它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servle ...

随机推荐

  1. eclipse生成可执行jar包(引入第三方.jar文件)

    1. eclipse建立普通的java project项目(项目名aa) 2. 项目正常组织通过buildpath加载各种jar包入项目aa比如例子项目里,加入了spring 各种jar包加入各种配置 ...

  2. Javaweb异常提示信息统一处理

    Java异常封装(自己定义错误码和描述,附源码) 2016年01月29日 22:30:54 小宝鸽 阅读数:23262 标签: java异常 更多 个人分类: Java基础 所属专栏: Java工作实 ...

  3. nodeclub route

    这里是把web_router.js放在根目录下,也可以放在routes文件件下,其实都可以. 这里就是一些url与controller和middleware对应

  4. [FAILED]Marking disk "DATA02" as an ASM disk

    执行删除asm磁盘时报错! [root@rac1 grid]# /etc/init.d/oracleasm deletedisk DATA01 /dev/sdc1 Marking disk " ...

  5. AngularJS controller as vm方式

    从AngularJS1.20开始引入了Controller as 新语法,以前版本在Controller 中必须注入$scope这个服务,才能在视图绑定中使用这些变量,$scope不是那么POJO(普 ...

  6. 分形之龙形曲线(Dragon Curve)

    龙形曲线(Dragon Curve)又叫分形龙,是一种自相似碎形曲线的统称,因形似龙的蜿蜒盘曲而得名. 一种简单的生成分形龙的方式是:拿着一条细长的纸带,把它朝下的一头拿上来,与上面的一头并到一起.用 ...

  7. Win7下无法启动sql server fulltext search (mssqlserver)的问题

    在Win7下安装了SQL Server 2005, 但启动“SQL Server FullText Search (MSSQLSERVER)”服务时启动不成功,系统日志显示“SQL Server Fu ...

  8. Devexpress中Gridcontrol查找分组

    private void button1_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns. ...

  9. UWP FillRowViewPanel

    最近有童鞋有这种需求,说实话我不知道这个Panel怎么起名字. 效果连接https://tuchong.com/tags/风光/ 下面是我做成的效果,可以规定每个Row的Items个数 2个 3个 4 ...

  10. 改变PowerDesigner数据模型字体大小

    一 改变左侧菜单字体大小Tools----->General------->Fonts-------->根据item选项的不同改变字体的大小 二 改变数据模型Table的字体大小To ...