我这边的鉴权是在拦截器里做的,后面用户又加了渠道权限,我这边的想法是在用户表中加一个channels字段,然后channels在请求中放到header中传递。
上代码
默认HttpServletRequest是没有修改Header值得方法, 不过我们可以自定义类继承HttpServletRequestWrapper
package com.hzsx.rent.business.web.util;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.*;
@Slf4j
public class HeaderMapRequestWrapper extends HttpServletRequestWrapper {
/**
* construct a wrapper for this request
*
* @param request
*/
public HeaderMapRequestWrapper(HttpServletRequest request) {
super(request);
}
private Map<String, String> headerMap = new HashMap<>();
/**
* add a header with given name and value
*
* @param name
* @param value
*/
public void addHeader(String name, String value) {
headerMap.put(name, value);
}
@Override
public String getHeader(String name) {
log.info("getHeader --->{}",name);
String headerValue = super.getHeader(name);
if (headerMap.containsKey(name)) {
headerValue = headerMap.get(name);
}
return headerValue;
}
/**
* get the Header names
*/
@Override
public Enumeration<String> getHeaderNames() {
List<String> names = Collections.list(super.getHeaderNames());
for (String name : headerMap.keySet()) {
names.add(name);
}
return Collections.enumeration(names);
}
@Override
public Enumeration<String> getHeaders(String name) {
log.info("getHeaders --->>>>>>{}",name);
List<String> values = Collections.list(super.getHeaders(name));
log.info("getHeaders --->>>>>>{}",values);
if (headerMap.containsKey(name)) {
log.info("getHeaders --->{}",headerMap.get(name));
values = Arrays.asList(headerMap.get(name));
}
return Collections.enumeration(values);
}
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader("token");
BackstageUserDto userDto = JSON.parseObject((String) RedisUtil.get(RedisKeyConstant.TOKEN_PREFIX + token), BackstageUserDto.class);
String channels = userDto.getChannels();
if (StringUtil.isNotEmpty(channels)) {
String header = request.getHeader("Request");
HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(request);
requestWrapper.addHeader("Request", header + "No=" + channels);
request = requestWrapper;
这是在拦截去器中做的,我认为在这里request就已经被替换掉了,但是事实证明不行。在接下来一个拦截器中接收到的参数还是原HttpServletRequest 请求头并没有呗添加进去
所有我这里定义一个filter,用@Order(Ordered.HIGHEST_PRECEDENCE + 101)注解设置这个filter紧接着拦截器去执行。
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain){
HttpServletRequest request = (HttpServletRequest) servletRequest;
String token = request.getHeader("token");
BackstageUserDto userDto = JSON.parseObject((String) RedisUtil.get(RedisKeyConstant.TOKEN_PREFIX + token), BackstageUserDto.class);
String channels = userDto.getChannels();
if (StringUtil.isNotEmpty(channels)) {
String header = request.getHeader("Request");
HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(request);
requestWrapper.addHeader("Request", header + "&No=" + channels);
try{
filterChain.doFilter(requestWrapper, servletResponse);
}catch (Exception e){
e.printStackTrace();
log.error("处理channels请求头异常");
}
}
}
这里用filterChain.doFilter替换就可以了
版权声明:程序员胖胖胖虎阿 发表于 2022年11月8日 上午7:08。
转载请注明:httpServletRequest添加 修改 header,Interceptor 添加 修改header | 胖虎的工具箱-编程导航
转载请注明:httpServletRequest添加 修改 header,Interceptor 添加 修改header | 胖虎的工具箱-编程导航
相关文章
暂无评论...
