[Primavera] parámetro argumentResolver encargo analizador para resolver el problema de la identificación de usuario
entorno del proyecto: Primavera + Spring MVC + Spring Security + Otros
sistema desarrollado recientemente en el proceso, hay algún método controlador requiere que el cliente pasar valor ID de usuario.
Obtener un comienzo en LocalStorage almacenada en JS ID de usuario presentada, hay solicitudes susceptibles de ser falsificados.
Dado que el marco usando Spring Security, el usuario puede obtener información directamente a través de la principal, por lo que teniendo en cuenta la seguridad, no ayuda al usuario a realizar el ID de usuario que envía la solicitud, pero la iniciativa para entrar en el ID de usuario del servidor.
SecurityContext sc = SecurityContextHolder.getContext ();
Autenticación auth = sc.getAuthentication ();
LoginUser loginUser = (LoginUser) auth.getPrincipal ();
Entero userID = loginUser.getId ();
Pero cada vez que el controlador de Riga este período, el número de controladores de más de uno, el código se vuelve simple, por lo que incluso pensar en el uso de anotaciones de la primavera de resolver.
Después de registrarse la información en línea, Spring MVC puede añadir información adicional a través de anotaciones en función, por lo que estos datos pueden ser entregados a añadir anotaciones y el marco para manejar la asignación.
El primer paso, anotaciones complemento personalizados, notas nombradas UserId
/ **
* @author qinyuguan
* /
@Target ({ElementType.PARAMETER})
@Retention (RetentionPolicy.RUNTIME)
@Documented
pública @ interfaz UserId {
boolean requerido () por defecto verdadera ;
}
El segundo paso, escribir el parámetro de identificación de usuario del analizador
/ **
* @author qinyuguan
* @Date 15/03/2020 17:21
* /
Público de clase UserIdMethodArgumentResolver implementos HandlerMethodArgumentResolver {
@Anular
pública booleano supportsParameter (MethodParameter parámetros) {
si (parameter.getParameterType () es igual a (entero.. clase ) && parameter.hasParameterAnnotation (identificación de usuario. clase )) {
devolver cierto ;
}
volver falsa ;
}
@Anular
pública resolveArgument Objeto (MethodParameter parámetro, ModelAndViewContainer mavContainer, NativeWebRequest WebRequest, WebDataBinderFactory binderFactory) lanza la excepción {
UserId currentUserAnnotation = parameter.getParameterAnnotation (UserId. Clase );
SecurityContext sc = SecurityContextHolder.getContext ();
Autenticación auth = sc.getAuthentication ();
LoginUser loginUser = (LoginUser) auth.getPrincipal ();
Entero userId = loginUser.getId ();
volver ID de usuario;
}
}
El tercer paso, el registro analizador MvcConfig configuración
/ **
* @author qinyuguan
* @date 2020/3/15 17:27
*/
@Configuration
public class WebAppConfig{
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new UserIdMethodArgumentResolver());
}
};
}
}
最后,使用,在控制器里随便写一个方法,在参数里添加一个Id的参数,并为其添加@UserId注解:
@GetMapping("/main")
@ResponseBody
public Results getInfo(@UserId Integer userId){
System.out.println(userId);
return service.getInfo(userId);
}
测试,是否可用,控制台输出了用户ID。
1001