BaseLogoutSuccessHandler.java 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package com.yihu.base.security.hander;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.yihu.base.security.vo.SimpleResponse;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.security.core.Authentication;
  7. import org.springframework.security.oauth2.common.OAuth2AccessToken;
  8. import org.springframework.security.oauth2.provider.OAuth2Authentication;
  9. import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
  10. import org.springframework.security.web.authentication.logout.CompositeLogoutHandler;
  11. import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
  12. import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.util.StringUtils;
  15. import javax.servlet.ServletException;
  16. import javax.servlet.http.HttpServletRequest;
  17. import javax.servlet.http.HttpServletResponse;
  18. import java.io.IOException;
  19. /**
  20. * Created by 刘文彬 on 2018/5/3.
  21. */
  22. @Component("baseLogoutSuccessHandler")
  23. public class BaseLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
  24. @Autowired
  25. private DefaultTokenServices defaultTokenServices;
  26. @Autowired
  27. private ObjectMapper objectMapper;
  28. @Override
  29. public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
  30. super.onLogoutSuccess(request, response, authentication);
  31. String header = request.getHeader("Authorization");
  32. if(!StringUtils.isEmpty(header)){
  33. if ((header.toLowerCase().startsWith(OAuth2AccessToken.BEARER_TYPE.toLowerCase()))) {
  34. String authHeaderValue = header.substring(OAuth2AccessToken.BEARER_TYPE.length()).trim();
  35. //删除OAuth2Authentication
  36. OAuth2Authentication authen = defaultTokenServices.loadAuthentication(authHeaderValue);
  37. if(authen!=null){
  38. new CompositeLogoutHandler(new SecurityContextLogoutHandler()).logout(request,response,authen);
  39. //删除redis中的token
  40. if(defaultTokenServices.revokeToken(authHeaderValue)){
  41. return ;
  42. }
  43. }
  44. logger.info("登出失败");
  45. response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
  46. response.setContentType("application/json;charset=UTF-8");
  47. response.getWriter().write(objectMapper.writeValueAsString(new SimpleResponse("logout failure cause by redis delete token fail!")));
  48. }
  49. }
  50. }
  51. }