Spring拦截器拦截请求,获得加密的参数,怎样重新设置参数值?

Spring拦截器拦截请求,获得加密的参数,怎样重新设置参数值?,第1张

拦截器继承HandlerInterceptorAdapter类,并重写了preHandle()方法,在此方法中获得了加密后的参数字符串,解密后,怎么将解密后的参数重新设置到HttpServletRequest的URL后边,使得Action能够接受到这些参数?也就是替换加密的参数(request.getQueryString()方法得到的请求参数字符串,全部替换)

    拦截器

java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些 *** 作。

拦截器在在流行的开源框架中很常见 依赖的技术就是Java的动态代理

理解拦截器的核心原理对理解这些开源框架的体系结构至关重要

下面以一个简单的模型的来说明拦截器的实现的一般方法

模型分为以下模块

业务组件 是被代理和被拦截的对象

代理处理器 实现了InvocationHandler接口的一个对象

代理对象 Proxy对象

拦截器 普通的JavaBean 在调用业务方法的之前或者之后会自动拦截并执行自己的一些方法

客户端 执行业务处理的入口

以下是模型的实现

一 业务组件 分为业务接口和业务类

/**

* 业务组件接口

*/

public interface BusinessInterface {

public void doSomething()

}

/**

* 业务组件

*/

public class BusinessClass implements BusinessInterface{

public void doSomething() {

System out println( 业务组件BusinessClass方法调用:doSomething() )

}

}

二 代理处理器 包含了业务对象绑定动态代理类的处理 并实现了 InvocationHandler接口的invoke方法

import java lang reflect InvocationHandler

import java lang reflect Method

import java lang reflect Proxy

/**

* 动态代理处理器工具

*/

public class DynamicProxyHandler implements InvocationHandler {

private Object business    //被代理对象

private InterceptorClass interceptor = new InterceptorClass()    //拦截器

/**

* 动态生成一个代理类对象 并绑定被代理类和代理处理器

*

* @param business

* @return 代理类对象

*/

public Object bind(Object business) {

this business = business

return Proxy newProxyInstance(

//被代理类 的ClassLoader

business getClass() getClassLoader()

//要被代理 的接口 本方法返回对象会自动声称实现了这些接口

business getClass() getInterfaces()

//代理处理 器对象

this)

}

/**

* 代理要调用的方法 并在方法调用前后调用连接器的方法

*

* @param proxy  代理类对象

* @param method 被代理的接口方法

* @param args   被代理接口方法的参数

* @return 方法调用返回的结果

* @throws Throwable

*/

public Object invoke(Object proxy Method method Object[] args) throws Throwable {

Object result = null

interceptor before()

result=method invoke(business args)

interceptor after()

return null  //To change body of implemented methods use File | Settings | File Templates

}

}

三 拦截器 普通的JavaBean 在调用业务方法的之前或者之后会自动拦截并执行自己的 一些方法

/**

* 拦截器

*/

public class InterceptorClass {

public void before(){

System out println( 拦截器InterceptorClass方法调用:before()! )

}

public void after(){

System out println( 拦截器InterceptorClass方法调用:after()! )

}

}

四 模拟客户端 执行业务处理的入口

/**

* 客户端

*/

public class Client {

public static void main(String args[]) {

DynamicProxyHandler handler = new DynamicProxyHandler()

BusinessInterface business = new BusinessClass()

BusinessInterface businessProxy = (BusinessInterface) handler bind(business)

businessProxy doSomething()

}

lishixinzhi/Article/program/Java/hx/201311/27143

本文将用简洁的代码构建一个springboot的拦截器。拦截器的使用很简单,定义一个自己的拦截器,向配置中添加一下就可以使用。为了方便,之后又引入了注解。

目录和概述

概述

假设需求:访问项目的controller是都要进行"token验证",除了某些像登录之类的方法。

项目结构:

TokenInterceptor.java 自定义拦截器

InterceptorConfig.java 添加拦截器进入项目

NoNeedToken.java 自定义注解

TestController.java 测试接口

1、自定义拦截器

在 TokenInterceptor.java 中输入以下代码,以下的代码将生成一个在请求到达controller前进行拦截的拦截器

import com.alibaba.fastjson.JSONObject

import org.springframework.lang.Nullable

import org.springframework.stereotype.Component

import org.springframework.web.servlet.HandlerInterceptor

import org.springframework.web.servlet.ModelAndView

import javax.servlet.http.HttpServletRequest

import javax.servlet.http.HttpServletResponse

import java.io.PrintWriter

import java.util.Arrays

import java.util.List

@Component

public class TokenInterceptor implements HandlerInterceptor {undefined

// 假设现在的token有如下数据

List tokenList = Arrays.asList("111", "222", "333")

// 这个方法是在访问接口之前执行的,我们只需要在这里写验证登陆状态的业务逻辑,就可以在用户调用指定接口之前验证登陆状态了

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {undefined

// 设置返回为json格式,使用UTF-8

response.setCharacterEncoding("UTF-8")

response.setContentType("application/jsoncharset=utf-8")

String token = request.getHeader("token")

PrintWriter out

// 之后写你的判断逻辑:return true是通过拦截器,可以继续访问controller,return false是不通过

if (token == null || !tokenList.contains(token)) {undefined

// 如果失败了返回{state:"false", msg:"token is null or wrong"}

JSONObject res = new JSONObject()

res.put("state","false")

res.put("msg","token is null or wrong")

out = response.getWriter()

out.append(res.toString())

return false

}

// 否则返回true 进入controller

return true

}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {undefined

}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {undefined

}

}

————————————————

版权声明:本文为CSDN博主「魔王别嚣张」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_36481714/article/details/114888055


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11890962.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存