标签:spring-boot interceptor spring
我有一个弹簧启动应用程序,它是REST Web服务.
我想添加一个拦截器,以便每个没有特定操作权限的角色都返回401错误代码.
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
logger.info("Request URL::" + httpServletRequest.getRequestURL().toString()
+ ":: Start Time=" + System.currentTimeMillis());
UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) httpServletRequest.getUserPrincipal();
String roleStr = token.getAuthorities().iterator().next().getAuthority();
String action = httpServletRequest.getServletPath();
Role role = roleRepository.findOne(Long.parseLong(roleStr));
if (role.getActions().contains(action)) {
return true;
}
httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
问题是响应总是返回HTML,如何像使用@RestController注释的控制器那样使响应以JSON形式返回?
谢谢
解决方法:
package com.sha.home;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sha.model.Message;
public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter{
private static final Logger logger = Logger.getLogger(ExecuteTimeInterceptor.class);
//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
System.out.println("start time"+startTime);
ObjectMapper mapper = new ObjectMapper();
Message msg = new Message("invalid","userinvalid");// customised pojo for error json message
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write(mapper.writeValueAsString(msg));
return false;
}
//after the handler is executed
public void postHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView)
throws Exception {
long startTime = (Long)request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
//modified the exisitng modelAndView
//log it
if(logger.isDebugEnabled()){
logger.debug("[" + handler + "] executeTime : " + executeTime + "ms");
}
}
}
enter code here
标签:spring-boot,interceptor,spring 来源: https://codeday.me/bug/20191119/2034135.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。