猿问

在 Java Spring 4 中执行从应用程序 A 到应用程序 B 的 rest

我有两个应用程序,在第一个应用程序中说用户通过用户名和密码登录。我通过在应用程序 A 中使用 spring 身份验证对象登录用户名。应用程序 A 正在对应用程序 B 进行 rest 或 soap api 调用。我通过在 rest 或 soap 调用的标头中添加用户名将用户名从 A 传递到 B 应用程序。应用程序 B 正在调用数据库,在 SQL 数据库上执行 CRUD。我想将该用户名保存在更新者、修改者字段中。我使用 bean 来存储用户名,但是当多个用户使用应用程序时,它会被覆盖。如何实现?谢谢


在下面的拦截器中,userSync 将保存我当前登录的用户名,usernameGetter 将用于从 http 请求中获取当前登录的用户名。userSync 和 usernameGetter 是单例 bean。


public class RequestInterceptor extends HandlerInterceptorAdapter {




private DomainUserSynchronizer userSynchronizer;


@Autowired

UsernameGetter usernameGetter;


@Autowired

private UserSynchronizer userSync;


private static final Logger LOGGER = LoggerFactory.getLogger(RequestInterceptor.class);




@Override

public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

        throws Exception {


    LOGGER.info("Inside after completion");

}


@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

        throws Exception {


    // do nothing


}


@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

        throws Exception {


    HttpSession session = request.getSession();


    // Enumeration e = (Enumeration) (session.getAttributeNames());


     //session.getAttribute("an");

     //session.getAttribute("MYSPEAK_SESSION_HASH");




    String username = usernameGetter.getUsernameFromSession(request);

    if(username!=null && !username.isEmpty()){

        LOGGER.info("Found username in request: "+ username);

        LOGGER.info("Setting username in userSynchronizer: "+ username);

        userSync.getCurrentUser().setName(username);

    }

    else{

        LOGGER.info(" Username not found in request: ");

        LOGGER.info("Setting default username in userSynchronizer: "+ userSync.getCurrentUser().getName());


    }   


    return true;

}


守候你守候我
浏览 104回答 1
1回答

斯蒂芬大帝

我猜你的问题在你通过 Spring 声明的 bean 的范围内:https ://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html我建议您检查所有调用是否都经过最大级别的请求范围。解决您的问题的另一点是通过休息/肥皂确认/回滚每次呼叫的交易。您可能会在不提交的情况下覆盖数据库的实体。为了避免更新中的覆盖,我建议添加一个日志记录表,您可以在其中跟踪所有修改,并且您只能对其进行插入(不可变/审计行)
随时随地看视频慕课网APP

相关分类

Java
我要回答